/**
 * https://www.bilibili.com/video/BV1Mb411e7re?p=18
 * 使用中断: 时钟
 */
#include "Link/LCD1602_Utils.h"
#include "Link/Timer0_Utils.h"

static unsigned char sec = 0, min = 0, hour = 0, flag;

static void Timer0_Rountine();

void main_interrupt_clock() {
    LCD1602_Init(1);
    LCD_ShowString(1, 1, "Clock:");
    LCD_ShowString(2, 3, ":");
    LCD_ShowString(2, 6, ":");

    //初始化定时器0, 10ms溢出1次
    Timer0_Init(10000, 0);
    Timer0_setOnTickListener_Exact(1, &Timer0_Rountine);

    // while (1) {
        /**
         * 在主函数中显示, 不要在中断函数中显示
         * ∵液晶显示需要时间, 在中断函数中会导致即时不准确
         */
        FLAG:
        LCD_ShowNum(2, 1, hour, 2);
        LCD_ShowNum(2, 4, min, 2);
        LCD_ShowNum(2, 7, sec, 2);
        flag = 1;   //使用flag, 不要一直调用显示
    // }
    while (flag);
    goto FLAG;
}

/**
 * 中断函数
 */
static void Timer0_Rountine() {
    //static, 不会被重复初始化
    static unsigned char t0Count = 0;

    //重新赋初值, 防止溢出后从0重新开始计数
    // Timer0_reset();

    //定时1s
    t0Count++;
    if (t0Count >= 100) {
        t0Count = 0;
        sec ++;
        if (sec >= 60) {
            sec = 0;
            min++;
            if (min >= 60) {
                min = 0;
                hour++;
                if (hour >= 24) hour = 0;
            }
        }
        flag = 0;
    }
}